package com.snake

import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.DrawScope

// 蛇身
class SnakeBody {
    // 类型
    enum class Type {
        APPLE,  // 果子
        SNAKE   // 蛇
    }

    private var mColor: Color                               // 颜色
    private var mNext: SnakeBody? = null                    // 下一个蛇身
    private lateinit var mPosition: MutableState<Offset>    // 位置
    private val mSize: Size                                 // 尺寸

    /**
     * 构造方法。
     * @param type  类型
     */
    constructor(type: Type) {
        // 初始化成员
        mColor = Color.White
        mSize = Size(Const.GRID_SIZE, Const.GRID_SIZE)

        // 设置类型
        this.setType(type)
    }

    /**
     * 画自身。
     * @param drawer    绘图者
     */
    fun draw(drawer: DrawScope) {
        drawer.drawOval(mColor, position.copy(position.x * mSize.width, position.y * mSize.height), mSize)
    }

    /**
     * 初始化。
     * @param position  位置
     */
    @Composable
    fun Init(position: Offset = Offset(0f, 0f)) {
        mPosition = remember {
            mutableStateOf(position)
        }
    }

    /**
     * 获取/设置下一个蛇身。
     */
    var next: SnakeBody?
        get() = mNext
        set(value) {
            mNext = value
        }

    /**
     * 获取/设置位置。
     */
    var position: Offset
        get() = mPosition.value
        set(position) {
            mPosition.value = position
        }

    /**
     * 设置类型。
     * @param type  类型
     */
    fun setType(type: Type) {
        mColor = if (type == Type.SNAKE) Const.SNAKE_COLOR else Const.APPLE_COLOR
    }
}
